import axios from 'axios'
import login from '../api/login';
import tools from './tools'

// // 如果是在 vue-cli 或 create-react-app 脚手架项目中使用
// // process.env.XXX 获得环境变量值
// // 如果是在 vite 脚手架项目中使用
// // import.meta.env.XXX 获取环境变量值

// // const baseURL = import.meta.env.MODE === 'development' ? '' : 'http://162.14.108.31:5945'
// // 创建实例
// const service = axios.create({
//   baseURL: import.meta.env.VITE_BASE_API,
//   timeout: 10000,
// })

// /**
//  * 请示拦截
//  */
// service.interceptors.request.use(
//   config => {
//     // 请示头中添加 token 的传递
//     const token = tools.getCookie('token')
//     if (token) {
//       config.headers.Authorization = `Bearer ${token}`
//     }
//     return config
//   },
//   error => Promise.reject(error), // 出现异常，可进行全局错误提示
// )

// /**
//  * 响应拦截
//  */
// service.interceptors.response.use(
//   response => {
//     // 响应状态码为 2xx，表示成功
//     if (response.status >= 200 && response.status < 300) {
//       // 获取后端响应数据
//       // return response.data.list

//       const { status, data, message } = response.data
//       // 判断后端响应数据的规范
//       if (status === 200) {
//         return data
//       }

//       // 如果返回的 status 表示的是用户 token 异常的问题
//       // 则通常前端会清除本地用户登录的状态信息，然后跳转到登录页面重新登录
//       // TODO...

//       // 其它问题，则进行全局错误提示
//       return Promise.reject(message || '响应拦截时出现异常问题')
//     }
//     return null
//   },
//   error => Promise.reject(error), // 出现异常，可进行全局错误提示
// )

// export default service

// import axios, { AxiosInstance } from 'axios'

// 如果是在 vue-cli 或 create-react-app 脚手架项目中使用
// process.env.XXX 获得环境变量值
// 如果是在 vite 脚手架项目中使用
// import.meta.env.XXX 获取环境变量值
export const baseURL = 'http://47.109.84.222:8888'
// const baseURL = import.meta.env.MODE === 'development' ? '' : 'http://162.14.108.31:5945'

// 保存所有未完成的网络请求
let requests=[]
// 标记是否正在换取新的有效 token
let isFetching = false

// 创建实例
const service = axios.create({
  // baseURL: import.meta.env.VITE_BASE_API,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/x-www-form-urlencoded'
  }
})

/**
 * 请示拦截
 */
service.interceptors.request.use(
  config => {
    // 请示头中添加 token 的传递
    // const token = tools.getCookie('token')
    const token = sessionStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    console.log('config',config)
    return config
  },
  error => Promise.reject(error), // 出现异常，可进行全局错误提示
)

/**
 * 响应拦截
 */
service.interceptors.response.use(
  response => {
    // 响应状态码为 2xx，表示成功
    if (response.status >= 200 && response.status < 300) {
      // 获取后端响应数据
      // return response.data.listr

      const { status, data, message } = response.data
      // console.log(response)
      console.log(response.data)
      // 判断后端响应数据的规范
      if (status === 2000) {
        alert('登录成功')
        return data
      } if (status === 4000) {
        // 短token过期，实现无感刷新
        // 实现并发情况的token刷新，使用 promise 继续链式调用
        return new Promise((resolve, reject) => {
          if (!isFetching) {
            isFetching = true
        //     // token 更新
            service.get('api/v1/admin/sessions')
            .then((res) => {
              isFetching = false
              console.log('token', res.token)

              tools.setCookie('token', res.token, 60 * 60, '/')
              sessionStorage.setItem('token', res.token)
              requests.forEach((fn) => fn())
              // 清空 requests 数组
              requests = []
              resolve(service(response.config))
            })
            .catch((error) => {
              console.error(error)
              isFetching = false
              requests.forEach(fn => fn())
              requests = []
              // 处理 token 刷新失败的情况
              // ...
            })
          } else {
            requests.push(() => resolve(service(response.config)))
          }
        })
      } if (status === 4001 || status === 4002) {
        // 长token过期，或者token非法
        // 清除 token
        tools.setCookie('token', 1, -1, '/')
        window.location.reload()
      }

      // 如果返回的 status 表示的是用户 token 异常的问题
      // 则通常前端会清除本地用户登录的状态信息，然后跳转到登录页面重新登录
      // TODO...
      // token异常处理情况

      // 其它问题，则进行全局错误提示
      return Promise.reject(msg || '响应拦截时出现异常问题')
    }
    // return null
    return response
  },
  error => Promise.reject(error), // 出现异常，可进行全局错误提示
)

export default service
